package top.gangster.lunan.ossservice.controller;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSException;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import top.gangster.lunan.ossservice.service.OSSService;
import top.gangster.lunan.resolver.FileNameResolver;
import top.gangster.lunan.result.Result;

@RestController
@RequestMapping("/ossservice/oss")
public class OSSController {
	@Autowired
	OSSService ossService;

	/**
	 * <h2>该方法应在模板文件保存在数据库之前执行</h2>
	 * 上传合同模板文件，保存在OSS中
	 * @param file 合同模板文件
	 * @return Result include id、name、url
	 */
	@PostMapping("/template/upload")
	public Result saveTemplate(MultipartFile file) {
		// 生成文件id
		String id = IdWorker.getIdStr();
		// 获取文件后缀名
		String suffix = FileNameResolver.getFileSuffix(file.getOriginalFilename());
		// 获取文件名
		String fileName = id + suffix;
		String url;
		// 上传文件出现异常
		try {
			url = ossService.saveTemplate(file,fileName);
		} catch (Exception e) {
			e.printStackTrace();
			return Result.error().message(e.getMessage());
		}
		Map<String,String> map = new HashMap<>();
		map.put("id",id);
		map.put("name",file.getOriginalFilename());
		map.put("url",url);
		return Result.ok().data("map",map);
	}

	/**
	 * 从OSS中删除合同模板文件
	 * @param fileName 文件名（包括后缀）
	 * @return Result
	 */
	@DeleteMapping("/template/delete/{fileName}")
	public Result deleteTemplate(@PathVariable("fileName") String fileName) {
		try {
			ossService.deleteTemplate(fileName);
		} catch (OSSException | ClientException e) {
			e.printStackTrace();
			return Result.error().message(e.getMessage());
		}
		return Result.ok().message("删除文件成功");
	}

	/**
	 * <h2>该方法应在模板文件保存在数据库之前执行</h2>
	 * 上传合同文件，保存在OSS中
	 * @param file 合同文件
	 * @return Result include url
	 */
	@PostMapping("/contract/upload")
	public Result saveContract(MultipartFile file) {
		// 生成文件id
		String id = IdWorker.getIdStr();
		// 获取文件后缀名
		String suffix = FileNameResolver.getFileSuffix(file.getOriginalFilename());
		// 获取文件名
		String fileName = id + suffix;
		String url;
		// 上传文件出现异常
		try {
			url = ossService.saveContract(file,fileName);
		} catch (Exception e) {
			e.printStackTrace();
			return Result.error().message(e.getMessage());
		}

		Map<String,String> map = new HashMap<>();
		map.put("id",id);
		map.put("name",file.getOriginalFilename());
		map.put("url",url);
		return Result.ok().data("map",map);
	}

	/**
	 * 从OSS中删除合同文件
	 * @param fileName 文件名（包括后缀）
	 * @return Result
	 */
	@DeleteMapping("/contract/delete/{fileName}")
	public Result deleteContract(@PathVariable("fileName") String fileName) {
		try {
			ossService.deleteContract(fileName);
		} catch (OSSException | ClientException e) {
			e.printStackTrace();
			return Result.error().message(e.getMessage());
		}
		return Result.ok().message("删除文件成功");
	}
}
